// 文件接受方

// usage: ./hw5_recv 

#include <my_header.h>
#include <arpa/inet.h> 

#define BUFF_SIZE 3000

// 读写文件缓冲
char buf[BUFF_SIZE];

int main(int argc, char *argv[]){
    // 检查命令行传入参数数量
    ARGS_CHECK(argc, 1);

    // 打开管道读端
    int r_fd = open("1.pipe", O_RDONLY);
    ERROR_CHECK(r_fd, -1, "open 1.pipe");

    /*-------------------使用管道接收文件-------------------*/
    printf("文件接收中......\n");
    // 1、接收文件名长度
    uint32_t name_len_net;
    read(r_fd, &name_len_net, sizeof(name_len_net));
    uint32_t name_len = ntohl(name_len_net); // 网络序 -> 主机序
   
    // 2、在当前目录下创建文件夹
    mkdir("received_file", 0777);
    chdir("received_file");  // 切换当前工作路径

    // 3、接收文件名，按文件名创建文件
    char file_name[20] = {0};
    read(r_fd, file_name, name_len);
    int file_fd = open(file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666);
    ERROR_CHECK(file_fd, -1, file_name);

    // 4、接收文件内容并写入文件
    int count = 0;
    while((count = read(r_fd, buf, sizeof(buf))) > 0){
        write(file_fd, buf, count);
    }
    printf("文件接收完毕。请进入 ./received_file/%s 查看\n", file_name);
    /*-------------------使用管道接收文件-------------------*/

    // 关闭文件描述符
    close(r_fd);
    close(file_fd);

    return 0;
}